home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / misc_pto / mwpetz16 / poppadp.c < prev    next >
C/C++ Source or Header  |  1991-06-03  |  5KB  |  176 lines

  1. /* POPPADP.C -- Popup Editor Printing Functions */
  2.  
  3. #ifdef MEWEL
  4. #define FULLGDI
  5. #include <window.h>
  6. #include <string.h>
  7. #include <stdio.h>
  8. #undef NULL
  9. #define NULL 0
  10. #else
  11. #include <windows.h>
  12. #endif
  13. #include <string.h>
  14. #include "filedlg.h"                    /* for IDD_FNAME definition */
  15.  
  16. extern char szAppName [] ;              /* in POPPAD.C */
  17.  
  18. BOOL bUserAbort ;
  19. HWND hDlgPrint ;
  20.  
  21. BOOL FAR PASCAL PrintDlgProc (hDlg, iMessage, wParam, lParam)
  22.      HWND     hDlg ;
  23.      unsigned iMessage ;
  24.      WORD     wParam ;
  25.      LONG     lParam ;
  26.      {
  27.      switch (iMessage)
  28.           {
  29.           case WM_INITDIALOG:
  30.                EnableMenuItem (GetSystemMenu (hDlg, FALSE), SC_CLOSE,
  31.                                                             MF_GRAYED) ;
  32.                break ;
  33.  
  34.           case WM_COMMAND:
  35.                bUserAbort = TRUE ;
  36.                EnableWindow (GetParent (hDlg), TRUE) ;
  37.                DestroyWindow (hDlg) ;
  38.                hDlgPrint = 0 ;
  39.                break ;
  40.  
  41.           default:
  42.                return FALSE ;
  43.           }
  44.      return TRUE ;
  45.      }          
  46.  
  47. BOOL FAR PASCAL AbortProc (hPrinterDC, nCode)
  48.      HDC   hPrinterDC ;
  49.      short nCode ;
  50.      {
  51.      MSG   msg ;
  52.  
  53.      while (!bUserAbort && PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
  54.           {
  55.           if (!hDlgPrint || !IsDialogMessage (hDlgPrint, &msg))
  56.                {
  57.                TranslateMessage (&msg) ;
  58.                DispatchMessage (&msg) ;
  59.                }
  60.           }
  61.      return !bUserAbort ;
  62.      }
  63.  
  64. HDC GetPrinterDC ()
  65.      {
  66.      char szPrinter [64] ;
  67.      char *szDevice, *szDriver, *szOutput ;
  68.  
  69.      GetProfileString ("windows", "device", "", szPrinter, 64) ;
  70.  
  71.      if ((szDevice = strtok (szPrinter, "," )) &&
  72.          (szDriver = strtok (NULL,      ", ")) && 
  73.          (szOutput = strtok (NULL,      ", ")))
  74.           
  75.                return CreateDC (szDriver, szDevice, szOutput, NULL) ;
  76.  
  77.      return 0 ;
  78.      }
  79.  
  80. BOOL PrintFile (hInst, hWnd, hWndEdit, szFileName)
  81.      HANDLE     hInst ;
  82.      HWND       hWnd, hWndEdit ;
  83.      char       *szFileName ;
  84.      {
  85.      BOOL       bError = FALSE ;
  86.      char       szMsg [40] ;
  87.      FARPROC    lpfnAbortProc, lpfnPrintDlgProc ;
  88.      HDC        hPrnDC ;
  89.      PSTR      psBuffer ;
  90.      RECT       rect ;
  91.      short      yChar, nCharsPerLine, nLinesPerPage,
  92.                 nTotalLines, nTotalPages, nPage, nLine, nLineNum = 0 ;
  93.      TEXTMETRIC tm ;
  94.  
  95.      if (0 == (nTotalLines = (short) SendMessage (hWndEdit,
  96.                                              EM_GETLINECOUNT, 0, 0L)))
  97.           return FALSE ;
  98.  
  99.      if (NULL == (hPrnDC = GetPrinterDC ()))
  100.           return TRUE ;
  101.  
  102.      GetTextMetrics (hPrnDC, &tm) ;
  103.      yChar = tm.tmHeight + tm.tmExternalLeading ;
  104.  
  105.      nCharsPerLine = GetDeviceCaps (hPrnDC, HORZRES) / tm.tmAveCharWidth ;
  106.      nLinesPerPage = GetDeviceCaps (hPrnDC, VERTRES) / yChar ;
  107.      nTotalPages   = (nTotalLines + nLinesPerPage - 1) / nLinesPerPage ;
  108.  
  109.      psBuffer = (PSTR) LocalAlloc (LPTR, nCharsPerLine) ;
  110.  
  111.      EnableWindow (hWnd, FALSE) ;
  112.  
  113.      bUserAbort = FALSE ;
  114.      lpfnPrintDlgProc = MakeProcInstance (PrintDlgProc, hInst) ;
  115.      hDlgPrint = CreateDialog (hInst, "PrintDlgBox", hWnd, lpfnPrintDlgProc) ;
  116.      SetDlgItemText (hDlgPrint, IDD_FNAME, szFileName) ;
  117.  
  118.      lpfnAbortProc = MakeProcInstance (AbortProc, hInst) ;
  119.      Escape (hPrnDC, SETABORTPROC, 0, (LPSTR) lpfnAbortProc, NULL) ;
  120.  
  121.      strcat (strcat (strcpy (szMsg, szAppName), " - "), szFileName) ;
  122.                                         
  123.      if (Escape (hPrnDC, STARTDOC, strlen (szMsg), szMsg, NULL) > 0)
  124.           {
  125.           for (nPage = 0 ; nPage < nTotalPages ; nPage++)
  126.                {
  127.                for (nLine = 0 ; nLine < nLinesPerPage &&
  128.                                 nLineNum < nTotalLines ; nLine++, nLineNum++)
  129.                     {
  130.                     *(short *) psBuffer = nCharsPerLine ;
  131.  
  132. #ifdef MEWEL
  133.                     PrTextOut (hPrnDC, 0, yChar * nLine, psBuffer,
  134. #else
  135.                     TextOut (hPrnDC, 0, yChar * nLine, psBuffer,
  136. #endif
  137.                          (short) SendMessage (hWndEdit, EM_GETLINE,
  138.                                         nLineNum, (LONG) (LPSTR) psBuffer)) ;
  139.                     }
  140.  
  141.                if (Escape (hPrnDC, NEWFRAME, 0, NULL, (LPSTR) &rect) < 0)
  142.                     {
  143.                     bError = TRUE ;
  144.                     break ;
  145.                     }
  146.  
  147.                if (bUserAbort)
  148.                     break ;
  149.                }
  150.           }
  151.      else
  152.           bError = TRUE ;
  153.  
  154.      if (!bError)
  155.           Escape (hPrnDC, ENDDOC, 0, NULL, NULL) ;
  156.  
  157.      if (!bUserAbort)
  158.           {
  159.           EnableWindow (hWnd, TRUE) ;
  160.           DestroyWindow (hDlgPrint) ;
  161.           }
  162.  
  163.      if (bError || bUserAbort)
  164.           {
  165.           strcat (strcpy (szMsg, "Could not print: "), szFileName) ;
  166.           MessageBox (hWnd, szMsg, szAppName, MB_OK | MB_ICONEXCLAMATION) ;
  167.           }
  168.  
  169.      LocalFree ((LOCALHANDLE) psBuffer) ;
  170.      FreeProcInstance (lpfnPrintDlgProc) ;
  171.      FreeProcInstance (lpfnAbortProc) ;
  172.      DeleteDC (hPrnDC) ;
  173.  
  174.      return bError || bUserAbort ;
  175.      }
  176.